home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Programmer Disk
/
The Programmer Disk (Microforum).iso
/
xpro
/
c3
/
pro24
/
dxget.c
< prev
next >
Wrap
C/C++ Source or Header
|
1986-08-07
|
7KB
|
195 lines
/* dxget.c -- program to get Yamaha exclusive messages and write to file */
/*****************************************************************************
* Change Log
* Date | Change
*-----------+-----------------------------------------------------------------
* 13-Jun-86 | Created Change Log
*****************************************************************************/
#include "cext.h"
#include "stdio.h"
#include "mpu.h"
#include "midicode.h"
#include "userio.h"
#include "cmdline.h"
#define buffsize 17000
byte midibuff[buffsize];
extern int xbufftail;
extern int xbuffmask;
extern byte *xbuff;
extern byte *buff;
int xflag; /* for debugging */
int debptr;
/****************************************************************************
* Data for command line parsing
****************************************************************************/
#define nswitches 8
private char *switches[nswitches] =
{ "-help", "-miditrace", "-m", "-trace", "-t", "-block", "-d", "-debug" };
#define noptions 1
private char *options[noptions] = { "-tune" };
/*****************************************************************************
* Routines local to this module
*****************************************************************************/
private void instruct();
private boolean output();
/****************************************************************************
* instruct
* Effect: prints instructions for this routine
****************************************************************************/
private void instruct()
{
printf("This program will let you save DX7 and TX816 voice programs.\n");
printf("To save DX7 programs, you must connect\n");
printf(" DX7 MIDI OUT to MPU 401 MIDI IN.\n");
printf("For TX816 programs, connect TX816 MIDI OUT to MPU 401 MIDI IN,\n");
printf(" and set the OUT SLOT (leftmost display) to the module\n");
printf(" from which you want data.\n");
printf("For DX7: push the orange FUNCTION key, then the green 8. Push 8\n");
printf(" repeatedly until the display says SYS INFO AVAIL or\n");
printf(" SYS INFO UNAVAIL. If the display says SYS INFO UNAVAIL,\n");
printf(" push YES to change the display to SYS INFO AVAIL.\n");
printf(" Now, select a voice with the INTERNAL or CARTRIDGE button\n");
printf(" followed by a (green) number.\n");
printf("For ALL DX7 voices: after getting the SYS INFO AVAIL display,\n");
printf(" push 8 again to get MIDI TRANSMIT ?. Push YES.\n");
printf("For TX816: Hold down SELECT until you see UT in the display.\n");
printf(" Let up on SELECT and then push it once more to get the\n");
printf(" flashing dU. Push YES to dump all data from this module.\n");
printf(" Hold down SELECT until you see digits in the display.\n");
printf("After data is dumped, dxget will tell you what it got and write\n");
printf(" data to a file. Use dxput to copy a file to a dx module.\n");
}
/****************************************************************************
* main
* Effect: main program -- prompt user for information and get data
****************************************************************************/
void main(argc, argv)
int argc;
char *argv[];
{
FILE *fp; /* the output file */
int done = false; /* flag is true when user is done */
byte *msg; /* message pointer */
char filename[100]; /* the output file name */
char *s; /* the file name in the command line */
cl_init(switches, nswitches, options, noptions, argv, argc);
if (cl_switch("-help")) instruct();
/* get input file name: */
filename[0] = NULL; /* empty string */
if ((s = cl_arg(1)) != NULL) strcpy(filename, s);
while (!done) {
if (askbool("Do you want instructions", true)) instruct();
fp = fileopen(filename, "dx7", "w", "file name");
musicinit();
if (!midi_buffer(midibuff, buffsize)) printf("midi_buffer error\n");
while (getkey(false) != -1) ;
exclusive(true); /* tell mpu401 to send exclusive data */
printf("\nReady for your data. Type space when you are done...\n");
done = false;
while (!done) {
if (kbhit()) done = (getch() == ' ');
mpu_error_check(); /* look for buffer overflow */
}
musicterm();
msg = midibuff;
if (xbufftail == 0) printf("No data! Please start again.\n");
else while (output(fp, &msg, midibuff + xbufftail))
/* write messages */;
fclose(fp);
printf("DONE\n");
done = !askbool("Do you want to send another file", false);
filename[0] = NULL; /* force prompt for new file name */
}
}
/****************************************************************************
* output
* Inputs:
* FILE *fp: the file to write
* byte **msg: pointer to the message to write
* byte *msg_tail: points to byte after last byte of recorded data
* Outputs:
** byte **msg: is advanced to byte after the last byte of the message
* returns true if there is more data to output
* Effect:
* write data file using recorded data
* Assumes:
* fp is opened for writing
* msg_tail > *msg
****************************************************************************/
private boolean output(fp, msg, msg_tail)
FILE *fp;
byte **msg;
byte *msg_tail;
{
byte *this_msg = *msg; /* local message pointer */
int datalen; /* number of bytes in message */
int cksum; /* check sum of message */
int n; /* counts bytes printed on one line */
/* printf("*msg %x, this_msg %x, msg_tail %x\n",
* *msg, this_msg, msg_tail);
* printf("%d bytes to go.\n", msg_tail - this_msg);
*/
excldesc(this_msg);
/* for (i = *base; i < how_many; i+=4) {
* if (kbhit() && (getch() == ' ')) break;
* printf("%d: %x %x %x %x\n",
* i,
* midibuff[i],
* midibuff[i+1],
* midibuff[i+2],
* midibuff[i+3]);
* }
*/
this_msg = *msg;
/* printf("parity check\n");*/
datalen = (this_msg[4] << 7) + this_msg[5];
/* printf("datalen %x\n", datalen);*/
cksum = 0;
for (n = 6; n < datalen+6; n++) {
cksum = (cksum + this_msg[n]) & 0x7f;
}
/* printf("computed check sum %x, actual check sum %x\n",
cksum, midibuff[datalen+6]);*/
if ((cksum + this_msg[datalen+6]) & 0x7f != 0) {
fprintf(stderr, "Data has been garbled -- please start over.\n");
return false;
}
n = 0;
do { /* always print first byte, */
/* then terminate after printing MIDI_EOX */
fprintf(fp, "%x ", *this_msg);
if (n >= 15) { /* print 16 bytes per line */
n = 0;
fprintf(fp, "\n");
} else n++;
this_msg++;
} while (this_msg < msg_tail && *(this_msg-1) != MIDI_EOX) ;
fprintf(fp, "\n\n");
*msg = this_msg;
return this_msg < msg_tail;
}